clear; clc; close all

% 加载数据
load('dataNa05_10.mat'); % 替换为您的 MAT 文件名
data = dataNa05_10; % 数据主变量

% 初始化结果数组
results = {}; % 结果存储为 cell 数组，每行存储每个循环的数据

% 高斯滤波器设置
sigma = 25; % 高斯平滑标准差
filter_size = 6 * sigma + 1; % 高斯滤波器窗口大小
gauss_filter = fspecial('gaussian', [filter_size 1], sigma); % 创建高斯滤波器

% 遍历第四列中的每个 cell 数据
for i = 1:length(data(:,4)) % 遍历第4列
    all_cycles = data{i,4}; % 提取当前 cell 的所有循环
    num_cycles = length(all_cycles); % 循环数
    
    % 遍历每个循环
    for j = 1:num_cycles
        raw_data = all_cycles{j}(:,2); % 提取当前循环的原始电压数据
        
        % 原始数据保存在第一列
        original_data = raw_data;
        
        % --- 去噪处理 ---
        % 均值和标准差去噪（剔除超出3倍标准差的点）
        mean_val = mean(raw_data);
        std_val = std(raw_data);
        clean_data = raw_data(abs(raw_data - mean_val) <= 3 * std_val); % 保留正常值
      
        % --- 高斯平滑 ---
        smoothed_data = imfilter(clean_data, gauss_filter, 'replicate'); 
        
        % 提取特征
        max_val = max(smoothed_data); % 最大值
        min_val = min(smoothed_data); % 最小值
        
        % 计算曲率并找最大值
        % 曲率公式: k = |y''| / (1 + (y')^2)^(3/2)
        x = 1:length(smoothed_data); % 横坐标数据
        y = smoothed_data;
        dy = gradient(y); % 一阶导数
        ddy = gradient(dy); % 二阶导数
        curvature = abs(ddy) ./ (1 + dy.^2).^(3/2); % 曲率计算
        max_curvature = max(curvature); % 最大曲率
        
        % 将数据存储到结果中
        results{end+1,1} = original_data; % 原始数据
        results{end,2} = clean_data; % 去噪后数据
        results{end,3} = smoothed_data; % 平滑数据
        results{end,4} = max_val; % 最大值
        results{end,5} = min_val; % 最小值
        results{end,6} = max_curvature; % 最大曲率
    end
end

% 保存结果
save('dataNa08_10_processed_results.mat', 'results');
disp('处理完成，结果已保存');